package org.dromara.common.excel.handler;

import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.dromara.common.excel.annotation.Colour;
import org.dromara.common.excel.annotation.ExcelValid;

import java.lang.reflect.Field;
import java.util.List;

@Slf4j
public class CustomCellWriteHandler implements CellWriteHandler {

    @Override
    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
        if (isHead) {
            WriteCellData writeCellData = cellDataList.get(0);
            WriteCellStyle headWriteCellStyle = writeCellData.getOrCreateStyle();
            // 头的策略  样式调整
            Field field = head.getField();
            if (field.isAnnotationPresent(Colour.class)) {
                // 如果是头部 主表数据
                headWriteCellStyle.setFillForegroundColor(field.getAnnotation(Colour.class).value().getIndex());
            } else {
                //头背景 浅绿 子表数据
                headWriteCellStyle.setFillForegroundColor(IndexedColors.LIGHT_GREEN.getIndex());
            }
            WriteFont headWriteFont = new WriteFont();
            // 头字号
            headWriteFont.setFontHeightInPoints((short) 14);
            // 字体样式
            headWriteFont.setFontName("宋体");
            headWriteCellStyle.setWriteFont(headWriteFont);
            // 自动换行
            headWriteCellStyle.setWrapped(true);
            // 设置细边框
            headWriteCellStyle.setBorderBottom(BorderStyle.THIN);
            headWriteCellStyle.setBorderLeft(BorderStyle.THIN);
            headWriteCellStyle.setBorderRight(BorderStyle.THIN);
            headWriteCellStyle.setBorderTop(BorderStyle.THIN);

            // 设置必填项备注消息
            if (field.isAnnotationPresent(ExcelValid.class)) {
                Sheet sheet = writeSheetHolder.getSheet();
                // 备注
                Drawing<?> drawingPatriarch = sheet.createDrawingPatriarch();
                Comment comment = drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), 0, (short) cell.getColumnIndex() + 1, 1));
                comment.setString(new XSSFRichTextString(field.getAnnotation(ExcelValid.class).message()));
                // 将批注添加到单元格对象中
                sheet.getRow(cell.getRowIndex()).getCell(cell.getColumnIndex()).setCellComment(comment);
            }
            // 设置边框颜色 25灰度
            headWriteCellStyle.setBottomBorderColor(IndexedColors.GREY_25_PERCENT.getIndex());
            headWriteCellStyle.setTopBorderColor(IndexedColors.GREY_25_PERCENT.getIndex());
            headWriteCellStyle.setLeftBorderColor(IndexedColors.GREY_25_PERCENT.getIndex());
            headWriteCellStyle.setRightBorderColor(IndexedColors.GREY_25_PERCENT.getIndex());
            // 水平对齐方式
            headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
            // 垂直对齐方式
            headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        } else {
            for (int i = 1; i < cellDataList.size(); i++) {
                WriteCellData writeCellData = cellDataList.get(i);
                // 内容的策略 宋体
                WriteCellStyle contentStyle = writeCellData.getOrCreateStyle();
                // 设置垂直居中
                contentStyle.setVerticalAlignment(VerticalAlignment.CENTER);
                // 设置 水平居中
                contentStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
                WriteFont contentWriteFont = new WriteFont();
                // 内容字号
                contentWriteFont.setFontHeightInPoints((short) 12);
                // 字体样式
                contentWriteFont.setFontName("宋体");
                contentStyle.setWriteFont(contentWriteFont);
            }
        }
    }
}
